/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Rozvrh;

import InformacnaStruktura.CasBezDatumu;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 *  Trieda zmeny, ktorej časový interval je nastaviteľný
 * @author MartinaHlinková
 */
public class ZmenaNastavitelnejDlzky implements Zmeny {
    InformacnaStruktura.CasBezDatumu casOd;
    InformacnaStruktura.CasBezDatumu casDo;
    InformacnaStruktura.TypZmeny typCasu;
    InformacnaStruktura.TypZmeny typZmeny;
    
    /**
     * Konštruktor objektor triedy ZmenaNastavitelnejDlzky, s nastavenými časmi
     * @param odDoby    čas odkedy má trvať zmena
     * @param doDoby    čas dokedy má trvať zmena
     */
    public ZmenaNastavitelnejDlzky(InformacnaStruktura.CasBezDatumu odDoby, InformacnaStruktura.CasBezDatumu doDoby){
        this.casOd = odDoby;
        this.casDo = doDoby;
        this.typZmeny = InformacnaStruktura.TypZmeny.NASTAVITELNA;
        if(this.casOd.after(casDo) == true){
            this.typCasu = InformacnaStruktura.TypZmeny.NOCNA;
        }else if(casOd.before(new InformacnaStruktura.CasBezDatumu(22,0))== true && casOd.before(new InformacnaStruktura.CasBezDatumu(22,0))== false){
            this.typCasu = InformacnaStruktura.TypZmeny.NOCNA;
        }else if(casOd.before(new InformacnaStruktura.CasBezDatumu(6,0))== true && casOd.before(new InformacnaStruktura.CasBezDatumu(6,0))== false){
            this.typCasu = InformacnaStruktura.TypZmeny.NOCNA;
        }else{
            this.typCasu = InformacnaStruktura.TypZmeny.DENNA;
        }
    }

    @Override
    public CasBezDatumu pocetHodinVCentre() {
        int pocetMinut = InformacnaStruktura.CasBezDatumu.zmerajCasNaMinuty(casOd, casDo);
        int hodiny = (int)(pocetMinut/60);
        int minuty = (int)(pocetMinut%60);
        InformacnaStruktura.CasBezDatumu navrat = new InformacnaStruktura.CasBezDatumu(hodiny, minuty);
        return navrat;
    }

    @Override
    public CasBezDatumu getOdpracovanyCas() {
        int prestavka = this.pocetMinutPrestavky();
        InformacnaStruktura.CasBezDatumu cas = this.pocetHodinVCentre();
        if(cas.getMinuty()<prestavka){
            return new InformacnaStruktura.CasBezDatumu(cas.getHodiny()-1,cas.getMinuty()-prestavka +60);
        }else{
            return new InformacnaStruktura.CasBezDatumu(cas.getHodiny(),cas.getMinuty()-prestavka);
        }
    }

    @Override
    public int pocetMinutPrestavky() {
        InformacnaStruktura.CasBezDatumu pocetHodin = this.pocetHodinVCentre();
        if(pocetHodin.getHodiny() < 4 ||(pocetHodin.getHodiny() == 4 && pocetHodin.getMinuty() == 0)) return 0;
        if(pocetHodin.getHodiny() < 8 ||(pocetHodin.getHodiny() == 8 && pocetHodin.getMinuty() == 0)) return 30;
        return 45;
    }
    
    @Override
    public InformacnaStruktura.CasBezDatumu getCasOd(){
        return this.casOd;
    }
    
    @Override
    public InformacnaStruktura.CasBezDatumu getCasDo(){
        return this.casDo;
    }
    
    @Override
    public InformacnaStruktura.TypZmeny getTypZmeny(){
        return InformacnaStruktura.TypZmeny.NASTAVITELNA;
    }
    /**
     * Metóda, ktorá vráti typ času, v ktorom sa nachádza zmena. 
     * @return Ak zasahuje do intervali 22:00-6:00, tak je nočná, inak denná
     */
    public InformacnaStruktura.TypZmeny getTypCasu(){
        return this.typCasu;
    }

    @Override
    public String casToString() {
        String eol = System.getProperty("line.separator");  
        return  ""+ this.casOd.toString()+ eol+this.casDo.toString();
    }

    @Override
    public Element zmenaDoElementu(Document doc) {
        Element zmena = doc.createElement("zmena");
        Attr attrStandard = doc.createAttribute("nastav");
        zmena.setAttributeNode(attrStandard);
                                        
        Attr attrOdHod = doc.createAttribute("odHodiny");
        attrOdHod.setNodeValue(""+this.casOd.getHodiny());
        zmena.setAttributeNode(attrOdHod);
                                        
        Attr attrOdMin = doc.createAttribute("odMinuty");
        attrOdMin.setNodeValue(""+this.casOd.getMinuty());
        zmena.setAttributeNode(attrOdMin);
        
        Attr attrDoHod = doc.createAttribute("doHodiny");
        attrDoHod.setNodeValue(""+this.casDo.getHodiny());
        zmena.setAttributeNode(attrDoHod);
        
        Attr attrDoMin = doc.createAttribute("doMinuty");
        attrDoMin.setNodeValue(""+this.casDo.getMinuty());
        zmena.setAttributeNode(attrDoMin);
        
        return zmena;
    }

    /**
     * Metóda, ktorá načíta zmenu z JavaDOM elementu
     * @param element JavaDOM element s nastaviteľnou zmenou
     * @return načítaná nastaviteľná zmena
     */
    public static Zmeny nacitajZmenu(Element element) {
        if(element == null)return null;
        if(element.hasAttribute("nastav") == false || element.hasAttribute("odHodiny") == false ||
           element.hasAttribute("odMinuty") == false || element.hasAttribute("doHodiny") == false ||
           element.hasAttribute("doMinuty") == false)return null;
        Zmeny navrat = null;
        try{
            int hodinaOd = Integer.parseInt(element.getAttribute("odHodiny"));
            int minutaOd = Integer.parseInt(element.getAttribute("odMinuty"));
            int hodinaDo = Integer.parseInt(element.getAttribute("doHodiny"));
            int minutaDo = Integer.parseInt(element.getAttribute("doMinuty"));
            if(hodinaOd <0 || hodinaOd >23 || minutaOd <0 || minutaOd > 59 ||
               hodinaDo <0 || hodinaDo >23 || minutaDo <0 || minutaDo > 59) return null;
            
            InformacnaStruktura.CasBezDatumu casOd = new InformacnaStruktura.CasBezDatumu(hodinaOd,minutaOd);
            InformacnaStruktura.CasBezDatumu casDo = new InformacnaStruktura.CasBezDatumu(hodinaDo,minutaDo);
            navrat = new ZmenaNastavitelnejDlzky(casOd,casDo);
        }catch (Exception e) {
            e.printStackTrace();   
        }
        
        return navrat;
    }
    
    
}
